%------------------------------------------------------------------------%
%              Comunicaciones digitales y analógicas                     %
%                      Trabajo Práctico N 1                              %
%                                                                        %
%                       Eric Lionel Koplin                               %
%------------------------------------------------------------------------%
close all;clear all;clc;

%% 3) MAP 2_PAM 
A=1;
p=1/20;
q=1-p;
M=2;
k=1;

%---------------------------------------------------------------Parámetros
% Parametros de ajuste de la simulacion
%
SNRbdB = 0:10; % SNR por bit en dB
nsimbs = 1e5 ; % cantidad de simbolos que para cada valor de SNRbdB en el Montercarlo
%----------------------------------- Conversiones e inicializaciones varias
%
Eavg        = A^2 ;
SNRbveces   = 10.^(SNRbdB/10); % SNR por bit en veces
SNRdB       = SNRbdB + 10*log10(k);% SNR en dB
SNR         = 10.^(SNRdB/10);% SNR en veces
sigma       = sqrt(Eavg./SNR);
No          = 2*sigma.^2;

%-----------------------------------------------------Simulacion Montecarlo
%
%simbtx = randi(M,nsimbs*length(SNRbdB),1)-1;% simbolos a transmitir (en 1:M);
simbtx = binornd(1,p,nsimbs*length(SNRbdB),1);% simbolos a transmitir (en 1:M);
% Modulación: asigno x=0->s=-A; x=1->s=A
simbmod = simbtx*2*A-A; % simbolos modulados
ruido = randn(nsimbs,1)*sigma;
simbmod_ruido = simbmod + reshape(ruido,nsimbs*length(SNRbdB),1);
% Demodulación
umbral=ones(nsimbs,1)*sigma.^2*log(q/p);
simbrx=zeros(nsimbs*length(SNRbdB),1);
simbrx(simbmod_ruido>=reshape(umbral,nsimbs*length(SNRbdB),1))=1;
%Comparacion con estimador ML:
simbrxML=zeros(nsimbs*length(SNRbdB),1);
simbrxML(simbmod_ruido>=0)=1;

%cada columna es un canal con distinta snr y cada elemento es una señal

Pes = ones(1,nsimbs)*reshape(simbtx ~= simbrx,nsimbs,length(SNRbdB))/nsimbs ;
PesML = ones(1,nsimbs)*reshape(simbtx ~= simbrxML,nsimbs,length(SNRbdB))/nsimbs ;
% Ahora analizo los errores de bit (el Gray lo hizo el modulador )
%
bitstx = de2bi(simbtx) ; % convierto los simbolos transmitidos a bits
bitsrx = de2bi(simbrx) ; % convierto los simbolos recibidos a bits
% comparo los bits y cuento cuantos difieren
Peb = ones(1,nsimbs)*reshape(xor(bitstx,bitsrx)*ones(k,1),nsimbs,length(SNRbdB)) /k/nsimbs;

%--------------------------------------------------------P(error) teorica :
%
% Probabilidad de error de bit teorica de una 2−PAM
Pet = p*qfunc((A-umbral(1,:))./sigma)+q*qfunc((A+umbral(1,:))./sigma) ;

% Graficos
%
% Probabidad de error de simbolo
figure(3)
semilogy(SNRbdB,Pet,'-dr','linewidth',1.5);hold on
semilogy(SNRbdB,Pes,'-o','linewidth',1.5);
semilogy(SNRbdB,PesML,'-og','linewidth',1.5);hold off
grid on
box on
xlabel('SNR por bit (dB)') ;
ylabel('Pe')
legend('Curva teorica','Montecarlo MAP','Montecarlo ML','Location','SouthWest')
%print('../Figs/pes_2_nepam.png','-dpng');
% Probabilidad de error por bit
%{
figure(4)
semilogy(SNRbdB,Pet/k,'-dr');hold on
semilogy(SNRbdB,Peb,'-o','linewidth',1.5);hold off
grid on
box on
xlabel('SNR por bit (dB)') ;
ylabel('Pb')
legend('Curva teorica','Montecarlo','Location','SouthWest')
%}
%print('../Figs/peb_2_nepam.png','-dpng');